﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Npgsql;
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;


namespace WindowsFormsApplication1
{
    public partial class InfoTabla : Form
    {
        OracleCommand comando;
        OracleDataReader datos;
        NpgsqlCommand comandopsg;
        NpgsqlDataReader datospsg;
        string tabla, last_value;
        public void cargar_campos()
        {
            try
            {
                dgv_campos.Rows.Clear();
                dgv_campos.Columns.Clear();

                lbl_actualizando.Text = "Actualizando información...";
                disable_controls();
                String sentencia;
                int i = 0, j, columnas;
                if (frm_login.oracle)
                {
                    sentencia = "select column_name nombre, data_type tipo, data_length tamaño_bytes, nullable nulos, data_default por_defecto from all_tab_columns where table_name = '"+tabla+"'";
                    comando = new OracleCommand(sentencia, frm_login.con);
                    datos = comando.ExecuteReader();
                    columnas = Convert.ToInt32(datos.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_campos.Columns.Add(datos.GetName(j), datos.GetName(j));
                    }

                    while (datos.Read())
                    {
                        dgv_campos.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_campos.Rows[i].Cells[j].Value = Convert.ToString(datos[j]);
                        }
                        i++;
                    }

                }
                else
                {
                    sentencia = "SELECT column_name nombre, data_type tipo, is_nullable nulos, column_default por_defecto FROM information_schema.columns where table_name = '" + tabla + "'";
                    comandopsg = new NpgsqlCommand(sentencia, frm_login.conn);
                    datospsg = comandopsg.ExecuteReader();
                    columnas = Convert.ToInt32(datospsg.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_campos.Columns.Add(datospsg.GetName(j), datospsg.GetName(j));
                    }

                    while (datospsg.Read())
                    {
                        dgv_campos.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_campos.Rows[i].Cells[j].Value = Convert.ToString(datospsg[j]);
                        }
                        i++;
                    }
                }
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }
        }

        public void cargar_pk()
        {
            try
            {
                dgv_pk.Rows.Clear();
                dgv_pk.Columns.Clear();
                lbl_actualizando.Text = "Actualizando información...";
                disable_controls();
                String sentencia;
                int i = 0, j, columnas;
                if (frm_login.oracle)
                {
                    sentencia = "select cc.constraint_name nombre, cc.column_name campo from all_cons_columns cc, all_constraints c where c.constraint_type = 'P' and cc.constraint_name = c.constraint_name and c.table_name = '" + tabla + "'";
                    comando = new OracleCommand(sentencia, frm_login.con);
                    datos = comando.ExecuteReader();
                    columnas = Convert.ToInt32(datos.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_pk.Columns.Add(datos.GetName(j), datos.GetName(j));
                    }

                    while (datos.Read())
                    {
                        dgv_pk.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_pk.Rows[i].Cells[j].Value = Convert.ToString(datos[j]);
                        }
                        i++;
                    }

                }
                else
                {
                    sentencia = "SELECT c.constraint_name nombre, c.column_name campo FROM information_schema.constraint_column_usage c, pg_catalog.pg_constraint p where p.contype = 'p' and p.conname = c.constraint_name and c.table_name = '" + tabla + "'";
                    comandopsg = new NpgsqlCommand(sentencia, frm_login.conn);
                    datospsg = comandopsg.ExecuteReader();
                    columnas = Convert.ToInt32(datospsg.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_pk.Columns.Add(datospsg.GetName(j), datospsg.GetName(j));
                    }

                    while (datospsg.Read())
                    {
                        dgv_pk.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_pk.Rows[i].Cells[j].Value = Convert.ToString(datospsg[j]);
                        }
                        i++;
                    }
                }
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }
        }



        public void cargar_fk()
        {
            try
            {
                dgv_fk_mine.Rows.Clear();
                dgv_fk_mine.Columns.Clear();

                dgv_fk_foreign.Rows.Clear();
                dgv_fk_foreign.Columns.Clear();
                lbl_actualizando.Text = "Actualizando información...";
                disable_controls();
                String sentencia;
                int i = 0, j, columnas;
                if (frm_login.oracle)
                {
                    sentencia = "select cc.constraint_name nombre, cc.column_name campo from all_cons_columns cc, all_constraints c where c.constraint_type = 'R' and cc.constraint_name = c.constraint_name and cc.table_name = '" + tabla + "'";
                    comando = new OracleCommand(sentencia, frm_login.con);
                    datos = comando.ExecuteReader();
                    columnas = Convert.ToInt32(datos.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_fk_mine.Columns.Add(datos.GetName(j), datos.GetName(j));
                    }

                    while (datos.Read())
                    {
                        dgv_fk_mine.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_fk_mine.Rows[i].Cells[j].Value = Convert.ToString(datos[j]);
                        }
                        i++;
                    }
                    i = 0;
                    sentencia = "select r.constraint_name nombre, cc.column_name campo from (select constraint_name, r_constraint_name from all_constraints)r, all_cons_columns cc, all_constraints a where cc.constraint_name = r.r_constraint_name AND a.constraint_name = cc.constraint_name AND a.table_name = '" + tabla + "'";
                    comando = new OracleCommand(sentencia, frm_login.con);
                    datos = comando.ExecuteReader();
                    columnas = Convert.ToInt32(datos.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_fk_foreign.Columns.Add(datos.GetName(j), datos.GetName(j));
                    }

                    while (datos.Read())
                    {
                        dgv_fk_foreign.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_fk_foreign.Rows[i].Cells[j].Value = Convert.ToString(datos[j]);
                        }
                        i++;
                    }

                }
                else
                {
                    sentencia = "SELECT c.constraint_name nombre, c.column_name campo FROM information_schema.constraint_column_usage c, pg_catalog.pg_constraint p where p.contype = 'f' and p.conname = c.constraint_name and c.table_name = '" + tabla + "'";
                    comandopsg = new NpgsqlCommand(sentencia, frm_login.conn);
                    datospsg = comandopsg.ExecuteReader();
                    columnas = Convert.ToInt32(datospsg.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_fk_mine.Columns.Add(datospsg.GetName(j), datospsg.GetName(j));
                    }

                    while (datospsg.Read())
                    {
                        dgv_fk_mine.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_fk_mine.Rows[i].Cells[j].Value = Convert.ToString(datospsg[j]);
                        }
                        i++;
                    }
                    i = 0;
                    sentencia = "SELECT co.conname nombre, cc.column_name campo FROM pg_catalog.pg_constraint co, pg_catalog.pg_class cl, information_schema.constraint_column_usage cc WHERE cl.reltoastrelid = co.confrelid AND cc.constraint_name = co.conname AND co.contype = 'f' AND cl.relname = '" + tabla + "'";
                    comandopsg = new NpgsqlCommand(sentencia, frm_login.conn);
                    datospsg = comandopsg.ExecuteReader();
                    columnas = Convert.ToInt32(datospsg.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_fk_foreign.Columns.Add(datospsg.GetName(j), datospsg.GetName(j));
                    }

                    while (datospsg.Read())
                    {
                        dgv_fk_foreign.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_fk_foreign.Rows[i].Cells[j].Value = Convert.ToString(datospsg[j]);
                        }
                        i++;
                    }
                }
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }
        }


        public void cargar_cc()
        {
            try
            {
                dgv_cc.Rows.Clear();
                dgv_cc.Columns.Clear();
                lbl_actualizando.Text = "Actualizando información...";
                disable_controls();
                String sentencia;
                int i = 0, j, columnas;
                if (frm_login.oracle)
                {
                    sentencia = "select cc.constraint_name nombre, c.search_condition restriccion from all_cons_columns cc, all_constraints c where c.constraint_type = 'C' and cc.constraint_name = c.constraint_name and cc.table_name = '" + tabla + "'";
                    comando = new OracleCommand(sentencia, frm_login.con);
                    datos = comando.ExecuteReader();
                    columnas = Convert.ToInt32(datos.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_cc.Columns.Add(datos.GetName(j), datos.GetName(j));
                    }

                    while (datos.Read())
                    {
                        dgv_cc.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_cc.Rows[i].Cells[j].Value = Convert.ToString(datos[j]);
                        }
                        i++;
                    }

                }
                else
                {
                    sentencia = "SELECT cc.constraint_name nombre, cc.check_clause restriccion FROM information_schema.check_constraints cc, information_schema.table_constraints t WHERE t.constraint_name = cc.constraint_name AND t.table_name = '" + tabla + "'";
                    comandopsg = new NpgsqlCommand(sentencia, frm_login.conn);
                    datospsg = comandopsg.ExecuteReader();
                    columnas = Convert.ToInt32(datospsg.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_cc.Columns.Add(datospsg.GetName(j), datospsg.GetName(j));
                    }

                    while (datospsg.Read())
                    {
                        dgv_cc.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_cc.Rows[i].Cells[j].Value = Convert.ToString(datospsg[j]);
                        }
                        i++;
                    }
                }
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }
        }




        public void cargar_uc()
        {
            try
            {
                dgv_uc.Rows.Clear();
                dgv_uc.Columns.Clear();
                lbl_actualizando.Text = "Actualizando información...";
                disable_controls();
                String sentencia;
                int i = 0, j, columnas;
                if (frm_login.oracle)
                {
                    sentencia = "select cc.constraint_name nombre, cc.column_name campo from all_cons_columns cc, all_constraints c where c.constraint_type = 'U' and cc.constraint_name = c.constraint_name and cc.table_name = '" + tabla + "'";
                    comando = new OracleCommand(sentencia, frm_login.con);
                    datos = comando.ExecuteReader();
                    columnas = Convert.ToInt32(datos.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_uc.Columns.Add(datos.GetName(j), datos.GetName(j));
                    }

                    while (datos.Read())
                    {
                        dgv_uc.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_uc.Rows[i].Cells[j].Value = Convert.ToString(datos[j]);
                        }
                        i++;
                    }

                }
                else
                {
                    sentencia = "SELECT c.constraint_name nombre, c.column_name campo FROM information_schema.constraint_column_usage c, pg_catalog.pg_constraint p where p.contype = 'u' and p.conname = c.constraint_name and c.table_name = '" + tabla + "'";
                    comandopsg = new NpgsqlCommand(sentencia, frm_login.conn);
                    datospsg = comandopsg.ExecuteReader();
                    columnas = Convert.ToInt32(datospsg.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_uc.Columns.Add(datospsg.GetName(j), datospsg.GetName(j));
                    }

                    while (datospsg.Read())
                    {
                        dgv_uc.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_uc.Rows[i].Cells[j].Value = Convert.ToString(datospsg[j]);
                        }
                        i++;
                    }
                }
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }
        }


        public void cargar_extents()
        {
            try
            {
                dgv_extents.Rows.Clear();
                dgv_extents.Columns.Clear();
                lbl_actualizando.Text = "Actualizando información...";
                disable_controls();
                String sentencia;
                int i = 0, j, columnas;
                if (frm_login.oracle)
                {
                    sentencia = "select extent_id, bytes/1024 tamaño_kb from dba_extents where segment_name = '"+tabla+"'";
                    comando = new OracleCommand(sentencia, frm_login.con);
                    datos = comando.ExecuteReader();
                    columnas = Convert.ToInt32(datos.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_extents.Columns.Add(datos.GetName(j), datos.GetName(j));
                    }

                    while (datos.Read())
                    {
                        dgv_extents.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_extents.Rows[i].Cells[j].Value = Convert.ToString(datos[j]);
                        }
                        i++;
                    }

                    i = 0;

                    sentencia = "select count(*) cantidad, bytes/1024 tamaño_kb from dba_extents where segment_name = '"+tabla+"' group by bytes";
                    comando = new OracleCommand(sentencia, frm_login.con);
                    datos = comando.ExecuteReader();
                    columnas = Convert.ToInt32(datos.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_tam.Columns.Add(datos.GetName(j), datos.GetName(j));
                    }

                    while (datos.Read())
                    {
                        dgv_tam.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_tam.Rows[i].Cells[j].Value = Convert.ToString(datos[j]);
                        }
                        i++;
                    }

                    sentencia = "select count(*), SUM(bytes/1024) from dba_extents where segment_name = '"+tabla+"'";
                    comando = new OracleCommand(sentencia, frm_login.con);
                    datos = comando.ExecuteReader();
                    if (datos.Read())
                    {
                        lbl_totfilas.Text = datos[0].ToString();
                        lbl_tiempo.Text = datos[1].ToString() + " Kb";
                    }

                }
                else
                {
                    tabPage6.Dispose();
                }
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }
        }



        public void cargar_triggers()
        {
            try
            {
                dgv_triggers.Rows.Clear();
                dgv_triggers.Columns.Clear();
                lbl_actualizando.Text = "Actualizando información...";
                disable_controls();
                String sentencia;
                int i = 0, j, columnas;
                if (frm_login.oracle)
                {
                    sentencia = "select trigger_name nombre, triggering_event tipo, trigger_body from all_triggers where table_name = '" + tabla + "'";
                    comando = new OracleCommand(sentencia, frm_login.con);
                    datos = comando.ExecuteReader();
                    columnas = Convert.ToInt32(datos.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_triggers.Columns.Add(datos.GetName(j), datos.GetName(j));
                    }

                    while (datos.Read())
                    {
                        dgv_triggers.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_triggers.Rows[i].Cells[j].Value = Convert.ToString(datos[j]);
                        }
                        i++;
                    }

                }
                else
                {
                    sentencia = "SELECT t.trigger_name nombre, t.event_manipulation tipo, t.action_statement codigo FROM information_schema.triggers t WHERE t.event_object_table = '" + tabla + "'";
                    comandopsg = new NpgsqlCommand(sentencia, frm_login.conn);
                    datospsg = comandopsg.ExecuteReader();
                    columnas = Convert.ToInt32(datospsg.FieldCount);

                    for (j = 0; j < columnas; j++)
                    {
                        dgv_triggers.Columns.Add(datospsg.GetName(j), datospsg.GetName(j));
                    }

                    while (datospsg.Read())
                    {
                        dgv_triggers.Rows.Add();
                        for (j = 0; j < columnas; j++)
                        {
                            dgv_triggers.Rows[i].Cells[j].Value = Convert.ToString(datospsg[j]);
                        }
                        i++;
                    }
                }
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }
        }


        public InfoTabla()
        {
            InitializeComponent();
        }
        private void enable_controls()
        {

            lbl_actualizando.Visible = false;
            this.Refresh();
        }

        private void disable_controls()
        {

            lbl_actualizando.Visible = true;
            this.Refresh();
        }

        private void Tables_Load(object sender, EventArgs e)
        {
            actualizar();
        }

        private void actualizar()
        {
            
            tabla = this.Text;
            cargar_campos();
            cargar_pk();
            cargar_fk();
            cargar_cc();
            cargar_uc();
            cargar_extents();
            cargar_triggers();
            
        }

        private void dgv_campos_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
        {
            try
            {
                lbl_actualizando.Text = "Eliminando...";
                disable_controls();
                string sentencia;
                string nombre = dgv_campos.Rows[e.Row.Index].Cells[0].Value.ToString();
                if (frm_login.oracle)
                {
                    sentencia = "ALTER TABLE "+tabla+" DROP COLUMN " + nombre;
                    comando = new OracleCommand(sentencia, frm_login.con);
                    comando.ExecuteNonQuery();
                }
                else
                {
                    sentencia = "ALTER TABLE " + tabla + " DROP COLUMN " + nombre;
                    comandopsg = new NpgsqlCommand(sentencia, frm_login.conn);
                    comandopsg.ExecuteNonQuery();
                }

                MessageBox.Show("Campo eliminado con éxito");
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }
        }

        private void dgv_pk_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
        {
            try
            {
                lbl_actualizando.Text = "Eliminando...";
                disable_controls();
                string sentencia;
                string nombre = dgv_pk.Rows[e.Row.Index].Cells[0].Value.ToString();
                if (frm_login.oracle)
                {
                    sentencia = "ALTER TABLE " + tabla + " DROP CONSTRAINT " + nombre;
                    comando = new OracleCommand(sentencia, frm_login.con);
                    comando.ExecuteNonQuery();
                }
                else
                {
                    sentencia = "ALTER TABLE " + tabla + " DROP CONSTRAINT " + nombre;
                    comandopsg = new NpgsqlCommand(sentencia, frm_login.conn);
                    comandopsg.ExecuteNonQuery();
                }

                MessageBox.Show("Constraint eliminado con éxito");
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }
        }

        private void dgv_fk_mine_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
        {
            try
            {
                lbl_actualizando.Text = "Eliminando...";
                disable_controls();
                string sentencia;
                string nombre = dgv_fk_mine.Rows[e.Row.Index].Cells[0].Value.ToString();
                if (frm_login.oracle)
                {
                    sentencia = "ALTER TABLE " + tabla + " DROP CONSTRAINT " + nombre;
                    comando = new OracleCommand(sentencia, frm_login.con);
                    comando.ExecuteNonQuery();
                }
                else
                {
                    sentencia = "ALTER TABLE " + tabla + " DROP CONSTRAINT " + nombre;
                    comandopsg = new NpgsqlCommand(sentencia, frm_login.conn);
                    comandopsg.ExecuteNonQuery();
                }

                MessageBox.Show("Constraint eliminado con éxito");
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }
        }

        private void dgv_fk_foreign_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
        {
            try
            {
                lbl_actualizando.Text = "Eliminando...";
                disable_controls();
                string sentencia;
                string nombre = dgv_fk_foreign.Rows[e.Row.Index].Cells[0].Value.ToString();
                if (frm_login.oracle)
                {
                    sentencia = "ALTER TABLE " + tabla + " DROP CONSTRAINT " + nombre;
                    comando = new OracleCommand(sentencia, frm_login.con);
                    comando.ExecuteNonQuery();
                }
                else
                {
                    sentencia = "ALTER TABLE " + tabla + " DROP CONSTRAINT " + nombre;
                    comandopsg = new NpgsqlCommand(sentencia, frm_login.conn);
                    comandopsg.ExecuteNonQuery();
                }

                MessageBox.Show("Constraint eliminado con éxito");
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }

        }

        private void dgv_campos_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
        {
            try
            {
                if (e.RowIndex + 2 > dgv_campos.Rows.Count)
                {
                    lbl_insertar_campo.Visible = true;
                }
                else
                {
                    if (dgv_campos.Rows[e.RowIndex].Cells[e.ColumnIndex].Value == null)
                    {
                        last_value = "";
                    }
                    else
                    {

                        last_value = dgv_campos.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void dgv_campos_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                lbl_actualizando.Text = "Editando...";
                disable_controls();
                if ((!lbl_insertar_campo.Visible) || ((e.RowIndex + 2 <= dgv_campos.Rows.Count) && (!dgv_campos.AllowUserToAddRows)) || ((e.RowIndex + 3 <= dgv_campos.Rows.Count) && (dgv_campos.AllowUserToAddRows)))
                {
                    if (frm_login.oracle)
                    {
                        //Cuando tenga el tipo cambiar
                        string nombre = dgv_campos.Rows[e.RowIndex].Cells[0].Value.ToString();
                        string sentencia;
                        if (e.ColumnIndex == 0)
                        {
                            sentencia = "alter table " + tabla + " rename column " + last_value + " to " + nombre;
                        }
                        else
                        {
                            string tipo = dgv_campos.Rows[e.RowIndex].Cells[1].Value.ToString();
                            string nullable = dgv_campos.Rows[e.RowIndex].Cells[3].Value.ToString();
                            if (tipo == "VARCHAR2")
                            {
                                tipo = tipo + "(" + dgv_campos.Rows[e.RowIndex].Cells[2].Value.ToString() + ")";
                            }
                            if (e.ColumnIndex != 3)
                            {
                                nullable = "";
                            }
                            else
                            {
                                if (nullable == "Y")
                                {
                                    nullable = "null";
                                }
                                else
                                {
                                    nullable = "not null";
                                }
                            }
                            string defaults = dgv_campos.Rows[e.RowIndex].Cells[4].Value.ToString();
                            if (defaults != "")
                            {
                                defaults = " DEFAULT " + defaults;
                            }
                            sentencia = "ALTER TABLE " + tabla + " MODIFY " + nombre + " " + tipo + " " + nullable + defaults;
                        }
                        comando = new OracleCommand(sentencia, frm_login.con);
                        comando.ExecuteNonQuery();
                        MessageBox.Show("Campo editado con éxito");
                    }
                    else
                    {
                        string nombre = dgv_campos.Rows[e.RowIndex].Cells[0].Value.ToString();
                        string sentencia = "";
                        if (e.ColumnIndex == 0)
                        {
                            sentencia = "alter table " + tabla + " rename column " + last_value + " to " + nombre;
                        }
                        else if (e.ColumnIndex == 1)
                        {
                            string tipo = dgv_campos.Rows[e.RowIndex].Cells[1].Value.ToString();
                            sentencia = "alter table " + tabla + " ALTER " + nombre + " TYPE " + tipo;
                        }
                        else if (e.ColumnIndex == 2)
                        {
                            string nullable = dgv_campos.Rows[e.RowIndex].Cells[2].Value.ToString();
                            if (nullable == "NO")
                            {
                                sentencia = "alter table " + tabla + " ALTER " + nombre + " SET NOT NULL";
                            }
                            else
                            {
                                sentencia = "alter table " + tabla + " ALTER " + nombre + " DROP NOT NULL";
                            }
                        }
                        else if (e.ColumnIndex == 3)
                        {
                            string default_s = dgv_campos.Rows[e.RowIndex].Cells[3].Value.ToString();
                            if (default_s == "")
                            {
                                sentencia = "alter table " + tabla + " ALTER " + nombre + " DROP DEFAULT";
                            }
                            else
                            {
                                sentencia = "alter table " + tabla + " ALTER " + nombre + " SET DEFAULT " + default_s;
                            }
                        }
                        else
                        {
                            dgv_campos.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = last_value;
                        }
                        comandopsg = new NpgsqlCommand(sentencia, frm_login.conn);
                        comandopsg.ExecuteNonQuery();
                        MessageBox.Show("Campo editado con éxito");
                    }
                }
                else
                {
                    dgv_campos.AllowUserToAddRows = false;
                }
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }
        }

        private void lbl_insertar_campo_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            try
            {
                lbl_actualizando.Text = "Insertando...";
                disable_controls();
                string sentencia;
                int row = dgv_campos.Rows.Count -1;
                string nombre = dgv_campos.Rows[row].Cells[0].Value.ToString();
                string tipo = dgv_campos.Rows[row].Cells[1].Value.ToString();
                string nullable, default_s = "";
                if (frm_login.oracle)
                {
                    nullable = dgv_campos.Rows[row].Cells[3].Value.ToString();
                    if (nullable == "Y")
                    {
                          nullable = "null";
                    }
                    else
                    {
                           nullable = "not null";
                    }
                    DataGridViewCell temp = dgv_campos.Rows[row].Cells[4];
                    if (temp.Value != null)
                       {
                             default_s = " DEFAULT " + temp.Value.ToString();
                       }
                    sentencia = "ALTER TABLE " + tabla + " ADD " + nombre + " " + tipo + default_s + " " + nullable;
                    comando = new OracleCommand(sentencia, frm_login.con);
                    comando.ExecuteNonQuery();
                }
                else
                {
                    sentencia = "ALTER TABLE " + tabla + " ADD " + nombre +" "+ tipo;
                    comandopsg = new NpgsqlCommand(sentencia, frm_login.conn);
                    comandopsg.ExecuteNonQuery();
                }

                MessageBox.Show("Campo creado con éxito");
                dgv_campos.AllowUserToAddRows = true;
                lbl_insertar_campo.Visible = false;
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }
        }

        private void lbl_insertar_pk_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            try
            {
                lbl_actualizando.Text = "Insertando...";
                disable_controls();
                string sentencia;
                int row = dgv_pk.Rows.Count - 1;
                string nombre = dgv_pk.Rows[row].Cells[0].Value.ToString();
                string columna = dgv_pk.Rows[row].Cells[1].Value.ToString();
                if (frm_login.oracle)
                {
                    sentencia = "ALTER TABLE " + tabla + " add CONSTRAINT " + nombre + " PRIMARY KEY (" + columna + ")";
                    comando = new OracleCommand(sentencia, frm_login.con);
                    comando.ExecuteNonQuery();
                }
                else
                {
                    sentencia = "ALTER TABLE " + tabla + " add CONSTRAINT " + nombre + " PRIMARY KEY (" + columna + ")";
                    comandopsg = new NpgsqlCommand(sentencia, frm_login.conn);
                    comandopsg.ExecuteNonQuery();
                }

                MessageBox.Show("Primary key creada con éxito");
                dgv_pk.AllowUserToAddRows = true;
                lbl_insertar_pk.Visible = false;
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }
        }

        private void dgv_pk_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
        {
            try
            {
                if (e.RowIndex + 2 > dgv_pk.Rows.Count)
                {
                    lbl_insertar_pk.Visible = true;

                }
            }
            
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void dgv_pk_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (e.RowIndex + 3 > dgv_pk.Rows.Count)
                {
                    dgv_pk.AllowUserToAddRows = false;

                }
            }
            
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            
        }

        private void dgv_fk_mine_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
        {
            try
            {

                if (e.RowIndex + 2 > dgv_fk_mine.Rows.Count)
                {
                    lbl_insertar_fk.Visible = true;
                    lbl_tabla.Visible = true;
                    lbl_campo.Visible = true;
                    txt_tabla.Visible = true;
                    txt_campo.Visible = true;
                }
            }
            
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

        private void dgv_fk_mine_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            try
            {

                if (e.RowIndex + 3 > dgv_pk.Rows.Count)
                {
                    dgv_fk_mine.AllowUserToAddRows = false;

                }
            }

            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

        private void lbl_insertar_fk_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            try
            {
                lbl_actualizando.Text = "Insertando...";
                disable_controls();
                string sentencia;
                int row = dgv_fk_mine.Rows.Count - 1;
                string nombre = dgv_fk_mine.Rows[row].Cells[0].Value.ToString();
                string columna = dgv_fk_mine.Rows[row].Cells[1].Value.ToString();
                string f_tabla = txt_tabla.Text;
                string f_campo = txt_campo.Text;
                if (frm_login.oracle)
                {
                    sentencia = "ALTER TABLE " + tabla + " add CONSTRAINT " + nombre + " FOREIGN KEY (" + columna + ") REFERENCES " + f_tabla + " (" + f_campo + ")";
                    comando = new OracleCommand(sentencia, frm_login.con);
                    comando.ExecuteNonQuery();
                }
                else
                {
                    sentencia = "ALTER TABLE " + tabla + " add CONSTRAINT " + nombre + " FOREIGN KEY (" + columna + ") REFERENCES " + f_tabla + " (" + f_campo + ")";
                    comandopsg = new NpgsqlCommand(sentencia, frm_login.conn);
                    comandopsg.ExecuteNonQuery();
                }

                MessageBox.Show("Foreign key creada con éxito");
                dgv_fk_mine.AllowUserToAddRows = true;
                lbl_insertar_fk.Visible = false;
                lbl_tabla.Visible = false;
                lbl_campo.Visible = false;
                txt_tabla.Visible = false;
                txt_campo.Visible = false;
            }
            catch (OracleException oe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Oracle y su configuración\nA continuación se detalla la exepción: \n\n" + oe.Message, "Oracle exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (NpgsqlException pe)
            {
                MessageBox.Show("Revise que la información dada o espere unos segundos e intente denuevo.\nSi nada de esto funciona revise su conexión con el servidor Postgresql y su configuración\nA continuación se detalla la exepción: \n\n" + pe.Message, "Postgresql exeption", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Intente la operación nuevamente, de no funcionar reinicie la aplicación\n Se detalla la exepción:\n\n" + ex.Message, "Exepcion del sistema", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            finally
            {
                enable_controls();
            }
        }

        private void llb_actualizando_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            actualizar();
        }

        private void btn_cerrar_Click(object sender, EventArgs e)
        {
            this.Close();

        }

  
      
    }
}
